# Работа с системами контроля версий
## Описание
VCS - система контроля версий.
Стандартом в индустрии является Git, иногда встречается Mercurial и SVN, и очень редко другие.
Умение грамотно работать с VCS позволяет:
- Оперативно исправлять критические баги
- Отслеживать вклад разработчиков в продукт
- Контролировать качество кода

## Почему ветка важна?
Современные VCS позволяют:
- работать одновременно над одним или разными частями файлов
- оперативно синхронизировать кодовую базу
- иметь несколько вариантов состояний кодовой базы в разных ветках
- разрешать конфликты изменений
- просматривать историю изменений конкретных файлов или фрагментов кода
- собирать статистику по разработчикам

## Что будет, если её не делать?
- Низкое качество кодовой базы
- Невозможность быстро решать критические проблемы

## На кого может быть делегирована?
Умение работать с VCS на продвинутом уровне может быть делегировано на техлида или старших разработчиков.

## Практика
### Навыки работы с Git
Для комфортной разработки и взаимодействия в команде каждый разработчик должен уметь:
- Клонировать репозиторий
- Создавать ветки
- Переключаться между ветками
- Делать коммиты
- Делать fetch, pull и push
- Делать слияния веток
- Уметь разрешать конфликты при merge
- Уметь создавать Pull (Merge) Request

Один из опытных разработчиков, техлид или тимлид должны дополнительно уметь:
- Делать rebase
- Делать force push
- Работать с тегами
- Настраивать precommit хуки
- Настраивать конфиг git
- Работать со stash
и знать для чего это необходимо

### Наименования коммитов
1. В команде должно быть соглашение о наименовании коммитов
2. Все члены команды должны этому соглашению следовать

#### Пример соглашения
1. Все коммиты пишутся на русском языке
2. Все коммиты должны иметь следующий формат:
<номер задачи> <глагол> <субъект> <детали>`
Пример: JIRA-123 Изменил цвет кнопки "Сохранить" на красный
3. Допустимо писать подробности коммита в произвольной форме отступив 1 строку от заголовка
4. Недопустимо делать подряд несколько коммитов с одинаковой подписью
5. Название коммита должно показывать бизнес изменения, если они были, а не изменения в кодовой базе
6. В коммитах необходимо использовать термины из словаря проекта.

#### Хорошо
`JIRA-123 Изменил цвет кнопки "Сохранить" на красный`

`JIRA-123 Исправил ошибку в сообщении при ошибке авторизации`

`JIRA-123 Сверстал модальное окно подписки на новости сервиса`

`JIRA-123 Сделал обводку в информационной модалке`
#### Плохо
`fix`

`Отрефакторил код`

`Исправил мелкие баги`

`Добавил border: 1px в MessagePopup`

#### Почему это важно?
- Облегчается поиск по изменениям
- Появляется дополнительная документация
- Легко найти ответ на вопросы:
  - Зачем это сделано?
  - Когда это сделано?
  - Ошибка это или требование?
  - В рамках какой задачи это сделано?
  - Кем это сделано?
  - Можно ли это отрефакторить?
  - Устарел ли это код?
- Можно быстро формировать отчёты (ReleaseNotes)
- Легко понимать кто и что сделал за определённый промежуток времени

## Консультации
- [Telegram-чат TL Bootcamp](https://tlinks.run/tlbootcamp)

## Теория
### Способы прокачки
1. [Pro Git book](https://git-scm.com/book/ru/v2/)
2. [Скринкаст по Git](https://learn.javascript.ru/screencast/git)
3. [Игра в гит](https://learngitbranching.js.org/?locale=ru_RU)

### Методологии
#### GitHub-flow
[GitHub-flow](https://guides.github.com/introduction/flow/)

#### Git-flow
[Удачная модель ветвления для Git](https://habr.com/ru/post/106912/)

[Пожалуйста, перестаньте рекомендовать Git Flow](https://habr.com/ru/company/flant/blog/491320/)

#### Trunk-Based Development
[Trunk-Based Development](https://paulhammant.com/2013/04/05/what-is-trunk-based-development/)

### Статьи по теме
1. [Как сделать мир (или хотя бы ваш проект) чуточку лучше](https://medium.com/@stipjey/%D0%BA%D0%B0%D0%BA-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C-%D0%BC%D0%B8%D1%80-%D0%B8%D0%BB%D0%B8-%D1%85%D0%BE%D1%82%D1%8F-%D0%B1%D1%8B-%D0%B2%D0%B0%D1%88-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82-%D1%87%D1%83%D1%82%D0%BE%D1%87%D0%BA%D1%83-%D0%BB%D1%83%D1%87%D1%88%D0%B5-a7164c2e8d9)
2. [Как следует писать комментарии к коммитам](https://habr.com/ru/post/416887/)
